禅道 11.6 远程命令执行漏洞
一、漏洞简介
禅道项目管理软件是一款国产的,基于LGPL协议,开源免费的项目管理软件,它集产品管理、项目管理、测试管理于一体,同时还包含了事务管理、组织管理等诸多功能,是中小型企业项目管理的首选,基于自主的PHP开发框架──ZenTaoPHP而成,第三方开发者或企业可非常方便的开发插件或者进行定制。 厂商官网:https://www.zentao.net/ 而此次发现的漏洞正是ZenTaoPHP框架中的通用代码所造成的的,因此禅道几乎所有的项目都受此漏洞影响
二、漏洞影响
禅道 11.6
禅道开源版 9版本
三、复现过程
一开始想要找的就是rce漏洞,所以通过寻找rce漏洞找到了禅道框架的漏洞,也是一个比较意外的收获吧。这里想要rce其实是文件写入+文件包含组合getshell的,所以只要我们都能够在model文件中找到这两类功能函数就能够达到我们的目的,另外这里可能有人会提出疑问,都能够写文件了,难道不能直接getshell嘛?这里写入的文件名没有经过base64解密,前面也说了禅道对于GET的参数其实是有多重限制的,像"."也明显不在白名单规则里,所以最终放弃了这条路。 首先是文件写入漏洞,漏洞代码在module/editor/model.php中的save函数
这里对文件写入内容作了一定黑名单的限制,这个绕过比较简单就不多说了,懂的人都懂,另外会对filePath做可写限制,因此这里如果是linux服务器部署的话,推荐写在/tmp目录下,毕竟没有什么限制,而且物理路径比较可控,如果想要../来跳转目录写入,这个是会失败的。
文件包含这个点是在module/api/model.php的getMethod函数
这里传入filePath,最终经过了helper::import函数,这个函数跟进就会发现其实就是import函数,那么回到上面的代码,这里filePath就是我们写入的文件名,但是需要注意的是这里包含的是filePath的dirname,也就是说直接输入文件路径,最终包含的文件路径的上一级目录名,因此这里需要加上一层路径。
最终poc如下,需要给物理路径加上一层才能包含成功。
http://www.0-sec.org/zentaopms_11.6/www/api-getModel-api-getMethod-filePath=/tmp/123/1
image